package com.demo.async;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author gy
 * @date 2022/6/21
 * Executors可以创建我们常用的四种线程池：
 *
 * （1）newCachedThreadPool 创建一个可缓存线程池，如果线程池长度超过处理需要，可灵活回收空闲线程，若无可回收，则新建线程。不设上限，提交的任务将立即执行。
 *
 * （2）newFixedThreadPool 创建一个定长线程池，可控制线程最大并发数，超出的线程会在队列中等待。
 *
 * （3）newScheduledThreadPool 创建一个定长线程池，支持定时及周期性任务执行。
 *
 * （4）newSingleThreadExecutor 创建一个单线程化的线程池执行任务。
 *
 * submit方法
 *
 * 线程池建立完毕之后，我们就需要往线程池提交任务。通过线程池的submit方法即可，submit方法接收两种Runable和Callable。
 *
 * 区别如下：
 *
 * Runable是实现该接口的run方法，callable是实现接口的call方法。
 *
 * callable允许使用返回值，callable允许抛出异常。
 *
 * 4.3、@Async配置默认线程池和多个线程池处理
 * 在现实的互联网项目开发中，针对高并发的请求，一般的做法是高并发接口单独线程池隔离处理。
 *
 * 假设现在2个高并发接口：一个是修改用户信息接口，刷新用户redis缓存；一个是下订单接口，发送app push信息。
 * 往往会根据接口特征定义两个线程池，这时候我们在使用@Async时就需要通过指定线程池名称进行区分。
 */
public class AsyncThreadPool {

    /**
     * 直接使用的 jdk提供的默认线程池，其实我们可以手动创建线程池，然后控制里面的核心参数
     */
    private final ExecutorService executor = Executors.newCachedThreadPool() ;

    public void fun() throws Exception {

        executor.submit(new Runnable(){

            @Override
            public void run() {

                try {
                    //要执行的业务代码，我们这里没有写方法，可以让线程休息几秒进行测试

                    Thread.sleep(10000);

                    System.out.print("睡够啦~");

                }catch(Exception e) {

                    throw new RuntimeException("报错啦！！");

                }

            }

        });

    }
}
